// /*
// Copyright IBM Corp., DTCC All Rights Reserved.
//
// SPDX-License-Identifier: Apache-2.0
// */
// package com.liuke.study.chaincode;
//
// import java.time.ZoneId;
// import java.util.ArrayList;
// import java.util.HashMap;
// import java.util.List;
// import java.util.Map;
//
// import com.google.common.collect.Lists;
// import com.google.gson.Gson;
// import com.google.gson.GsonBuilder;
// import com.google.gson.JsonObject;
// import com.google.gson.JsonParser;
// import com.google.protobuf.ByteString;
// import io.netty.handler.ssl.OpenSsl;
// import org.apache.commons.logging.Log;
// import org.apache.commons.logging.LogFactory;
// import org.hyperledger.fabric.shim.ChaincodeBase;
// import org.hyperledger.fabric.shim.ChaincodeStub;
// import org.hyperledger.fabric.shim.ResponseUtils;
//
// import static java.nio.charset.StandardCharsets.UTF_8;
//
// public class MyChaincode extends ChaincodeBase {
//
//     private static Log _logger = LogFactory.getLog(MyChaincode.class);
//
//
//     @Override
//     public Response init(ChaincodeStub stub) {
//         try {
//             _logger.info("==>> 初始化链码 ");
//             String func = stub.getFunction();
//             if (!func.equals("init")) {
//                 return ResponseUtils.newErrorResponse("functionName 必须为 init");
//             }
//             List<String> args = stub.getParameters();
//             _logger.info(String.format("==>> 初始化: 参数个数 %s ;", args.size()));
//             if(args.size() % 2 != 0) {
//                 return ResponseUtils.newErrorResponse("args 应该[\"k1\",\"v1\",\"k2\",\"v2\"]");
//             }
//
//             for (int i = 0; i < args.size(); i++) {
//                 _logger.info(String.format("==>> 初始化: KEY = %s, VALUE = %s; ", args.get(i), args.get(i+1)));
//                 stub.putStringState(args.get(i), args.get(i+1));
//             }
//
//             return ResponseUtils.newSuccessResponse("chaincode 初始化完成");
//         } catch (Throwable e) {
//             return ResponseUtils.newErrorResponse(e);
//         }
//     }
//
//     @Override
//     public Response invoke(ChaincodeStub stub) {
//         try {
//             String channelId = stub.getChannelId();
//             String txId = stub.getTxId();
//             String time = stub.getTxTimestamp().atZone(ZoneId.systemDefault()).toLocalDateTime().toString();
//             String func = stub.getFunction();
//             _logger.info(String.format("==>> 开始执行链码  channelID: %s txID: %s func: %s time: %s", channelId, txId, func, time));
//             List<String> params = stub.getParameters();
//             if (func.equals("invoke")) {
//                 return invoke(stub, params);
//             }
//             if (func.equals("delete")) {
//                 return delete(stub, params);
//             }
//             if (func.equals("query")) {
//                 return query(stub, params);
//             }
//             if (func.equals("insert")) {
//                 return insert(stub, params);
//             }
//             return newErrorResponse("Invalid invoke function name. Expecting one of: [\"invoke\", \"delete\", \"query\"]");
//         } catch (Throwable e) {
//             return newErrorResponse(e);
//         }
//     }
//
//     private Response invoke(ChaincodeStub stub, List<String> args) {
//         if (args.size() != 3) {
//             return newErrorResponse("Incorrect number of arguments. Expecting 3");
//         }
//         String accountFromKey = args.get(0);
//         String accountToKey = args.get(1);
//
//         String accountFromValueStr = stub.getStringState(accountFromKey);
//         if (accountFromValueStr == null) {
//             return newErrorResponse(String.format("Entity %s not found", accountFromKey));
//         }
//         int accountFromValue = Integer.parseInt(accountFromValueStr);
//
//         String accountToValueStr = stub.getStringState(accountToKey);
//         if (accountToValueStr == null) {
//             return newErrorResponse(String.format("Entity %s not found", accountToKey));
//         }
//         int accountToValue = Integer.parseInt(accountToValueStr);
//
//         int amount = Integer.parseInt(args.get(2));
//
//         if (amount > accountFromValue) {
//             return newErrorResponse(String.format("not enough money in account %s", accountFromKey));
//         }
//
//         accountFromValue -= amount;
//         accountToValue += amount;
//
//         _logger.info(String.format("new value of A: %s", accountFromValue));
//         _logger.info(String.format("new value of B: %s", accountToValue));
//
//         stub.putStringState(accountFromKey, Integer.toString(accountFromValue));
//         stub.putStringState(accountToKey, Integer.toString(accountToValue));
//
//         _logger.info("Transfer complete");
//
//         return newSuccessResponse("invoke finished successfully", ByteString.copyFrom(accountFromKey + ": " + accountFromValue + " " + accountToKey + ": " + accountToValue, UTF_8).toByteArray());
//     }
//
//     // Deletes an entity from state
//     private Response delete(ChaincodeStub stub, List<String> args) {
//         if (args.size() != 1) {
//             return ResponseUtils.newErrorResponse("delete 参数不能为空");
//         }
//
//         List<String> successList = Lists.newArrayList();
//         for (String arg : args) {
//             try {
//                 stub.delState(arg);
//                 successList.add(arg);
//             } catch (Exception e){
//                 _logger.error(String.format("==>> 删除KEY: %s 失败"));
//             }
//         }
//         return ResponseUtils.newSuccessResponse("成功删除 KEYS:" + successList.toString());
//
//         // if (args.size() != 1) {
//         //     return ResponseUtils.newErrorResponse(String.format("delete 方法 参数个数必须 = 1, 当前个数: %s",args.size()));
//         // }
//         //
//         // _logger.info(String.format("开始删除KEY: %s", args.get(0)));
//         // stub.delState(args.get(0));
//
//         // Delete the key from the state in ledger
//         // return ResponseUtils.newSuccessResponse(String.format("删除KEY: %s 成功", args.get(0)));
//     }
//
//     private Response insert(ChaincodeStub stub, List<String> args) {
//         if (args.size() %2 != 1) {
//             return ResponseUtils.newErrorResponse(String.format("参数必须是 K-V 形式, [\"k1\",\"v1\",\"k2\",\"v2\"]"));
//         }
//
//         List<String> lists = new ArrayList<>();
//         for (int i = 0; i < args.size(); i++) {
//             try{
//                 _logger.info(String.format("==>> 开始INSERT: KEY = %s, VALUE = %s; ", args.get(i), args.get(i+1)));
//                 stub.putStringState(args.get(i), args.get(i+1));
//                 lists.add(args.get(i));
//             } catch (Exception e) {
//                 _logger.error(String.format("==>> 保存 KEY = %s, VALUE = %s; 失败", args.get(i), args.get(i+1)));
//             }
//         }
//
//         return ResponseUtils.newSuccessResponse("保存成功 KEYS: " + lists.toString());
//     }
//
//     // query callback representing the query of a chaincode
//     private Response query(ChaincodeStub stub, List<String> args) {
//         Map<String, String> map = new HashMap<>();
//         for (String arg : args) {
//             try {
//                 String val = stub.getStringState(arg);
//                 map.put(arg, ByteString.copyFrom(val, UTF_8).toStringUtf8());
//             } catch (Exception e) {
//                 _logger.error(String.format("==>> 查询 KEY = %s ; 失败", arg),e);
//             }
//         }
//         String jsonStr = new Gson().toJson(map);
//         return ResponseUtils.newSuccessResponse(jsonStr, jsonStr.getBytes());
//     }
//
// }
